package org.smart4j.framework.common.util;

import org.smart4j.framework.common.annotation.*;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 注解工具类
 *
 * @author YooLin1c
 * @version 1.0.0
 * @since 2018-01-30 13:35
 */
public final class AnnotationUtil {
    /**
     * 指定类是否被@Service注解
     *
     * @param clazz 指定类
     * @return true 是 false 否
     */
    public static boolean isServiceAnnotated(Class<?> clazz) {
        return isAnnotated(clazz, Service.class);
    }

    /**
     * 指定类是否被@Controller注解
     *
     * @param clazz 指定类
     * @return true 是 false 否
     */
    public static boolean isControllerAnnotated(Class<?> clazz) {
        return isAnnotated(clazz, Controller.class);
    }

    /**
     * 方法是否被@Action注解
     *
     * @param method 方法
     * @return true 是 false 否
     */
    public static boolean isActionAnnotated(Method method) {
        return isAnnotated(method, Action.class);
    }

    /**
     * 成员变量是否被@Inject注解
     *
     * @param field 成员变量
     * @return true 是 false 否
     */
    public static boolean isInjectAnnotated(Field field) {
        return isAnnotated(field, Inject.class);
    }

    /**
     * 指定类是否被指定注解所注解
     *
     * @param clazz      指定类
     * @param annotation 指定注解
     * @return true 是 false 否
     */
    public static boolean isAnnotated(Class<?> clazz, Class<? extends Annotation> annotation) {
        return clazz.isAnnotationPresent(annotation);
    }

    /**
     * 成员变量是否被指定注解所注解
     *
     * @param field      成员变量
     * @param annotation 指定注解
     * @return true 是 false 否
     */
    private static boolean isAnnotated(Field field, Class<? extends Annotation> annotation) {
        return field.isAnnotationPresent(annotation);
    }

    /**
     * 方法是否被指定注解所注解
     *
     * @param method     方法
     * @param annotation 指定注解
     * @return true 是 false 否
     */
    private static boolean isAnnotated(Method method, Class<? extends Annotation> annotation) {
        return method.isAnnotationPresent(annotation);
    }

    /**
     * 指定类是否被@Aspect所注解
     *
     * @param clazz 指定类
     * @return true 是 false 否
     */
    public static boolean isAspectAnnotated(Class<?> clazz) {
        return clazz.isAnnotationPresent(Aspect.class);
    }

    /**
     * 指定方法是否被@Transaction方法所注解
     *
     * @param method 指定方法
     * @return true 是 false 否
     */
    public static boolean isTransactionAnnotated(Method method) {
        return method.isAnnotationPresent(Transaction.class);
    }
}
